﻿using Application_Core.Bauteil_Component.Access_Layer;
using Application_Core.Bestellung_Component.Data_Access_Layer;
using Application_Core.Bestellung_Component.Data_Access_Layer.Implementations;
using Application_Core.Kunde_Component.Access_Layer;
using System;
using Utility.Persistence_Service;

namespace Application_Core.Bestellung_Component.Business_Logic_Layer
{
    internal class BestellungComponentBusinessLogicImpl : BestellungComponentBusinessLogic
    {
        private readonly AngebotRepository angebotRepo;
        private readonly AuftragRepository auftragRepo;
        private readonly UnitOfWork unitOfWork;
        private readonly KundeInternalService kundeInternal;
        private readonly BauteilInternalService bauteilInternal;

        public BestellungComponentBusinessLogicImpl(UnitOfWork unitOfWork, KundeInternalService kundeInternal, BauteilInternalService bauteilInternal)
        {
            this.unitOfWork = unitOfWork;
            this.kundeInternal = kundeInternal;
            this.bauteilInternal = bauteilInternal;
            this.angebotRepo = new AngebotRepositoryImpl(unitOfWork);
            this.auftragRepo = new AuftragRepositoryImpl(unitOfWork);
        }

        public void CreateAngebot(Angebot angebot, int kundennummer, int bauteilnummer)
        {
            int kundeId = this.kundeInternal.FindIdByNummer(kundennummer);
            int bauteilId = this.bauteilInternal.FindIdByNummer(bauteilnummer);
            angebot.KundeId = kundeId;
            angebot.BauteilId = bauteilId;
            this.angebotRepo.Create(angebot);
        }

        public void CreateAuftrag(Angebot angebot, int auftragsnummer, int fertigungsauftragsnummer)
        {
            Auftrag auftrag = this.auftragRepo.Create(new Auftrag(auftragsnummer, false, DateTime.Today, angebot));
            this.bauteilInternal.CreateFertigungsauftrag(fertigungsauftragsnummer, auftrag.Id, angebot.BauteilId);
        }

        public void DeleteAuftrag(int auftragsnummer, int fertigungsauftragsnummer)
        {
            this.bauteilInternal.DeleteFertigungsauftrag(fertigungsauftragsnummer);
            Auftrag auftrag = this.auftragRepo.FindByNummer(auftragsnummer);
            this.auftragRepo.Delete(auftrag);
        }
    }
}
